package com.ruoyi.business.controller.imagecontroller;
import com.ruoyi.business.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 *通用请求的控制器
 * 比如上传文件和下载文件
 */
@RestController
@Slf4j
@RequestMapping("/business/common2")
public class CommonController {

    //获得yml文件里的图片保存路径，但是这个路径可能不存在，在下面要判断，没有则生成

    @Value("${reggie.picturePath}")
    private String picturePath;


//    private String picturePath="D:\\ruoyi\\uploadPath\\upload";
    /**
     * 文件长传功能
     * @param file MultipartFile格式，且变量名要和前端的input的name值相同
     * @return     return Result.success(fileName);     //返回值是上传成功的文件的新文件名，返回文件名是因为前端可能需要保存该文件名，到时候发给后端保存到数据库中
     */
    @PostMapping("/upload2")
    public Result<String> upload(MultipartFile file){//这里的变量名file和前端input上传文件的输入框的name值要一样
        //file文件是一个临时文件，需要转存到指定位置，否则一次请求结束，则被清除

        //1，获得新的文件名
        //获得原始文件名
        String originalFilename = file.getOriginalFilename();//但原始文件名可能重复导致覆盖问题
        //使用UUID生成唯一文件名，防止重复覆盖的问题，网上下载的文件，如果很长一串字符，可能是UUID生成的，不是原始文件名,UUID生成类似这种94d183b6-2848-46b0-8c96-318d05cc60e1
        String UUIDStr= UUID.randomUUID().toString();//生成类似DJSAIJD的字符，还差后缀   //当然也可以直接UUID字符加上原始文件名
//        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//拿到后缀.XXX
//
//
//        String fileName=UUIDStr+suffix;
        //使用UUID加上注释加上原始文件名构成新的文件名,既保证了唯一性，也保证了原始文件名的可读写
        String fileName=UUIDStr+originalFilename;
//        String fileName=UUIDStr+"原始文件名为"+originalFilename;

        //2,判断图片的保存路径
        //使用该路径生成目录
        File dir=new File(picturePath);
        if(!dir.exists()){//如果发现这个目录不存在，说明yml的路径不存在
            //生成该路径对应的目录
            dir.mkdirs();
        }


        //3,将临时文件file保存到指定位置以及设置新文件名
        try {
            file.transferTo(new File(picturePath+fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //上传成功后返回让照片回显
//        this.download(fileName,response);
        //返回值是上传成功的文件的新文件名，返回文件名是因为前端可能需要保存该文件名，到时候发给后端保存到数据库中
        return Result.success(fileName);

    }


    @PostMapping("/moreUpload")
    public Result<String> upload(@RequestParam("files") MultipartFile[] files) {
        // 创建一个用于存储文件名的列表
        List<String> fileNames = new ArrayList<>();

        // 遍历上传的每个文件
        for (MultipartFile file : files) {
            // 以下是您现有的文件保存逻辑
            // ... (略)
            //1，获得新的文件名
            //获得原始文件名
            String originalFilename = file.getOriginalFilename();//但原始文件名可能重复导致覆盖问题
            //使用UUID生成唯一文件名，防止重复覆盖的问题，网上下载的文件，如果很长一串字符，可能是UUID生成的，不是原始文件名,UUID生成类似这种94d183b6-2848-46b0-8c96-318d05cc60e1
            String UUIDStr= UUID.randomUUID().toString();//生成类似DJSAIJD的字符，还差后缀   //当然也可以直接UUID字符加上原始文件名
//        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//拿到后缀.XXX
//
//
//        String fileName=UUIDStr+suffix;
            //使用UUID加上注释加上原始文件名构成新的文件名,既保证了唯一性，也保证了原始文件名的可读写
            String fileName=UUIDStr+originalFilename;
//        String fileName=UUIDStr+"原始文件名为"+originalFilename;

            //2,判断图片的保存路径
            //使用该路径生成目录
            File dir=new File(picturePath);
            if(!dir.exists()){//如果发现这个目录不存在，说明yml的路径不存在
                //生成该路径对应的目录
                dir.mkdirs();
            }


            //3,将临时文件file保存到指定位置以及设置新文件名
            try {
                file.transferTo(new File(picturePath+fileName));
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 将文件名添加到列表中
            fileNames.add(fileName);
        }

        // 将文件名列表拼接成以逗号分隔的字符串
        String joinedFileNames = String.join(",", fileNames);

        // 返回多张图片的文件名以逗号分隔拼接的形式
        return Result.success(joinedFileNames);
    }

    @GetMapping("/download")
    public void download(String name , HttpServletResponse response)  {
        try {
            //1,输入流--文件输入流，获取文件
            FileInputStream fileInputStream=new FileInputStream(new File(picturePath+name));

            String contentType = getContentType(name); // 自定义方法，根据文件名获取对应的Content-Type

            //2,输出流--Response输出到浏览器
            ServletOutputStream outputStream = response.getOutputStream();

            //设置响应给浏览器的格式是图片形式
            response.setContentType(contentType);

            int len=0;
            byte[] bytes=new byte[1024];

            while((len=fileInputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
                outputStream.flush();
            }

            //3，关闭流
            fileInputStream.close();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }




    }

    //获取图片后缀名
    private String getContentType(String fileName) {
        String contentType = "application/octet-stream"; // 默认为二进制流类型
        if (fileName != null && !fileName.isEmpty()) {
            if (fileName.toLowerCase().endsWith(".jpg") || fileName.toLowerCase().endsWith(".jpeg")) {
                contentType = "image/jpg";
            } else if (fileName.toLowerCase().endsWith(".png")) {
                contentType = "image/png";
            } else if (fileName.toLowerCase().endsWith(".gif")) {
                contentType = "image/gif";
            } // 可以根据实际情况添加更多的图片格式判断
        }
        return contentType;
    }




    @GetMapping("/downloadApp")
    public void downloadApp( HttpServletResponse response)  {
        try {
            String name ="test.apk";
            //1,输入流--文件输入流，获取文件
            FileInputStream fileInputStream=new FileInputStream(new File(picturePath+name));

            String contentType = getContentType2(name); // 自定义方法，根据文件名获取对应的Content-Type

            response.setHeader("Content-Disposition", "attachment; filename=" + name);
            //2,输出流--Response输出到浏览器
            ServletOutputStream outputStream = response.getOutputStream();

            //设置响应给浏览器的格式是图片形式
            response.setContentType(contentType);

            int len=0;
            byte[] bytes=new byte[1024];

            while((len=fileInputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
                outputStream.flush();
            }

            //3，关闭流
            fileInputStream.close();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }




    }
    // 注入HttpServletRequest对象
    @Autowired
    private HttpServletRequest request;

    // 获取ServletContext对象
    private ServletContext getContext() {
        return request.getServletContext();
    }


    private String getContentType2(String fileName) {
        ServletContext servletContext = getContext(); // 自定义方法，获取ServletContext
        String mimeType = servletContext.getMimeType(fileName);
        return mimeType != null ? mimeType : "application/octet-stream";
    }

}